package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.service.CategoryService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import sun.security.krb5.internal.ccache.CCacheInputStream;

import java.util.List;

@RestController//@response 和@controller 和在一起 作用一样
@Slf4j//日志  category 是分类的意思
@RequestMapping("/category")//映射路径
public class CategoryController {
    @Autowired //让spring容器中的对象,自动装配到这个属性中
    private CategoryService categoryService;
    @PostMapping
    public R<String> save(@RequestBody Category category){
        log.info("[添加操作]");
        categoryService.save(category);
        return R.success("添加成功");
    }
    @GetMapping("/page")
    public R<Page> page(int page ,int pageSize){
        log.info("[分页查询]");
        Page<Category> Page1 = new Page<>(page,pageSize);
        //条件是排序
        LambdaQueryWrapper<Category> ops = new LambdaQueryWrapper();
        ops.orderByAsc(Category::getSort);
        categoryService.page(Page1,ops);

        return R.success(Page1);
    }
    @DeleteMapping()
    //因为数据库多表之间没有设置外键关系,所以用java代码写逻辑外键替代数据库外键的设置
    public R<String> delete(Long id){
        log.info("[删除操作]");
        //mybatis-plus可以自己写业务,也可以用封装好的方法.
        categoryService.deleteById(id);

        return R.success("删除成功");
    }
    @PutMapping()
    public R<String> update(@RequestBody Category category){
        log.info("[修改操作]");
        categoryService.updateById(category);

        return R.success("修改成功");
    }
    @GetMapping("/list")
    //形参如果不许要讲json数据转为java数据就不用加@RequestBody注解,加的话会出错
    public R<List<Category>> select(Category category){
        log.info("[条件查询]");
        LambdaQueryWrapper<Category> lqw = new LambdaQueryWrapper();
        //三个条件也可以写两个条件,判断是否为空,是空就不执行后面拼接sql语句,不是空就拼接sql语句.
        //判断Integer类型需要手动判断,string类型有一个判断方法 StringUtils::isNotEmpty,用这个判断是否有值
        lqw.eq(category.getType()!=null,Category::getType,category.getType());//表示where "Type"= Type
        lqw.orderByAsc(Category::getSort);//根据那个字段排
        List<Category> list = categoryService.list(lqw);


        return R.success(list);
    }
}
